<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------

namespace Think\Db\Driver;
use Think\Db\Driver;

/**
 * Pgsql数据库驱动
 */
class Pgsql extends Driver{

    /**
     * 解析pdo连接的dsn信息
     * @access public
     * @param array $config 连接信息
     * @return string
     */
    protected function parseDsn($config){
        $dsn  =   'pgsql:dbname='.$config['database'].';host='.$config['hostname'];
        if(!empty($config['hostport'])) {
            $dsn  .= ';port='.$config['hostport'];
        }
        return $dsn;
    }

    /**
     * 取得数据表的字段信息
     * @access public
     * @return array
     */
    public function getFields($tableName) {
        $tmp    = explode('.', $tableName);
        $schema = null;

        if (count($tmp)==2) {
            $schema    = $tmp[0];
            $tableName = $tmp[1];
        }

        $sql = 'select a.attname as field,
                    t.typname as type,
                    a.attnotnull as null,
                    i.indisprimary as key,
                    d.adsrc as default
                    from pg_class c
                    inner join pg_attribute a on a.attrelid = c.oid
                    inner join pg_type t on a.atttypid = t.oid
                    left join pg_attrdef d on a.attrelid=d.adrelid and d.adnum=a.attnum
                    left join pg_index i on a.attnum=ANY(i.indkey) and c.oid = i.indrelid';

        if (!empty($schema)) {
            $sql .= ' left join pg_namespace s on c.relnamespace=s.oid';
        }

        $sql .= " where (c.relname='{$tableName}' or c.relname = lower('{$tableName}')) AND a.attnum > 0 ";

        if (!empty($schema)) {
            $sql .= " AND s.nspname='{$schema}' ";
        }

        $sql .= ' order by a.attnum asc;';
        $r    = [];

        if (!$result = $this->query($sql)) {
            return $r;
        }

        foreach ($result as $key => $val) {
            $r[$val['field']] = array(
                'name'    => $val['field'],
                'type'    => $val['type'],
                'notnull' => (bool)$val['null'],
                'default' => $val['default'],
                'primary' => (bool)$val['key'],
                'autoinc' => (strtolower($val['default']) == "nextval('{$tableName}_id_seq'::regclass)"),
            );
        }

        return $r;
    }

    /**
     * 取得数据库的表信息
     * @access public
     * @return array
     */
    public function getTables($dbName='') {
        $result =   $this->query("select tablename as Tables_in_test from pg_tables where  schemaname ='public'");
        $info   =   array();
        foreach ($result as $key => $val) {
            $info[$key] = current($val);
        }
        return $info;
    }

    /**
     * limit分析
     * @access protected
     * @param mixed $lmit
     * @return string
     */
    public function parseLimit($limit) {
        $limitStr    = '';
        if(!empty($limit)) {
            $limit  =   explode(',',$limit);
            if(count($limit)>1) {
                $limitStr .= ' LIMIT '.$limit[1].' OFFSET '.$limit[0].' ';
            }else{
                $limitStr .= ' LIMIT '.$limit[0].' ';
            }
        }
        return $limitStr;
    }

}
